home *** CD-ROM | disk | FTP | other *** search
/ Mac Power 1996 October / MACPOWER-1996-10.ISO.7z / MACPOWER-1996-10.ISO / AMUG / Internet_31 / NetCacheResolver 0.9d6 / NetCacheResolver 0.9d6 ト / library / NCR_AppleEvent.c next >
Text File  |  1996-05-12  |  33KB  |  1,135 lines

  1. // NetCache Resolver, 1995 (C) Mizutori Tetsuya
  2. // - NCR_AppleEvent.c, October 10, 1995
  3. // This document is pretty printed in 10-point Geneva font.
  4.  
  5. #include <AppleEvents.h>
  6. #include <AERegistry.h>
  7. #include <AEObjects.h>
  8.  
  9. #include "NCR_Basic.h"
  10. #include "NCR_AppleEvent.h"
  11. #include "NCR_File.h"
  12. #include "NCR_Resolve.h"
  13. #include "NCR_Qsort.h"
  14. #include "NCR_Error.h"
  15. #ifdef DEBUG
  16. #include "NCR_Message.h"
  17. #endif /* DEBUG */
  18.  
  19. #ifdef COMMNET
  20. 1. Initialize
  21.     call SetupAppleEvent()
  22.  
  23. 2. Apple Event precess
  24.     case: AEOpenApplication
  25.         call DoOpenApplication()
  26. //        set  gAEOpenAppl = true
  27.  
  28.     case: AEOpenDocuments
  29. ///        call DoOpenDocumentBegin()
  30.         call DoOpenDocument( &theFSSpec, index, count ) for each file
  31. //        set  gAEOpenDoc = true
  32. ///        call DoOpenDocumentEnd()
  33.  
  34.     case: AEPrintDocuments
  35.         call DoPrintDocument()
  36. //        set  gAEPrintDoc = true
  37.  
  38.     case: AEQuitApplication
  39.         call DoQuitApplication()
  40. //        set  gAEQuitAppl = true
  41.  
  42. #endif /* COMMENT */
  43.  
  44. enum myAppleEventSuits {
  45.     kAEActivate    = 'actv',
  46.     
  47. // AppleScript Command: resolve $typeAlias$ [with sorted by $Enum$]
  48.     kNCRSuite        = 'MzcR',        // EVENT CLASS
  49.     kAEResolve        = 'rslv',        // EVENT ID
  50. // Reply:
  51. //    typeAEList        = 'list',        // a list of string 'TEXT'
  52. // Direct Parameter: 
  53. //    typeAlias        = 'alis',        // a list of aliases
  54. // Other Parameters: [with sorted by name/date/size/type/url]
  55.     kAESorted        = 'soby',        // KEYWORD
  56.     typeSortOption    = 'Esrt',        // see also Enumaration
  57.  
  58. // AppleScript Command: sort $typeAEList$
  59. //                    [at $integer$] [in regular/normal] [as alphabet/number] [with $TEXT$]
  60. //    kNCRSuite        = 'MzcR',        // EVENT CLASS
  61.     kAESort        = 'sort',        // EVENT ID
  62. // Reply:
  63. //    typeAEList        = 'list',        // a list of string 'TEXT'
  64. // Direct Parameter: 
  65. //    typeAEList        = 'list',        // a list of string 'TEXT'
  66. // Other Parameter: [at $integer$]
  67.     kAEPosition    = 'posn',        // KEYWORD
  68. //    typeLongInteger    = 'long',        // field number
  69. // Other Parameter: [by name/date/size/type/url]
  70. //    kAESorted        = 'soby',        // KEYWORD
  71. //    typeSortOption    = 'Esrt',        // see also Enumaration
  72. // Other Parameter: [in regular/normal]
  73.     kAEOrder        = 'ordr',        // KEYWORD
  74.     typeOrderOption    = 'Eord',        // see also Enumaration
  75. // Other Parameter: [as alphabet/number]
  76.     kAETypeAs        = 'type',        // KEYWORD
  77.     typeTypeOption    = 'Etyp',        // see also Enumaration
  78. // Other Parameter: [with $TEXT$]
  79.     kAESeparator    = 'sepa',        // KEYWORD
  80. //    typeChar        = 'TEXT',        // field separator
  81.  
  82. // AppleScript Command: assign $typeObjectSpecifier$ to value
  83. //    kNCRSuite        = 'MzcR',        // EVENT CLASS
  84. //    kAESetData        = 'setd',        // EVENT ID
  85. // Reply:
  86. //    typeNull        = 'null',
  87. // Direct Parameter: 
  88. //    typeObjectSpecifier    = 'obj ',    // an object
  89. // Other Parameters: to value
  90. //    kAEData        = 'data',        // KEYWORD
  91. //    typeWildCard    = '****',
  92.  
  93. // AppleScript Command: show about
  94. //    kNCRSuite        = 'MzcR',        // EVENT CLASS
  95.     kAEShowAbout    = 'abou',        // EVENT ID
  96. // Reply:
  97. //    typeNull        = 'null',
  98. // Direct Parameter: 
  99. //    typeNull        = 'null',
  100. // Other Parameters:
  101. //    typeNull        = 'null',
  102.  
  103.     _myAppleEventSuits
  104. };
  105.  
  106. enum myEnumerateKey {
  107. //    typeSortOption    = 'Esrt',
  108.     keyByName    = 'sona',
  109.     keyByDate        = 'soda',
  110.     keyBySize        = 'sosi',
  111.     keyByType        = 'soty',
  112.     keyByUrl        = 'sour',
  113.     _myEnumerationKey
  114. };
  115.  
  116. enum myEnumrateOrder {
  117. //    typeOrderOption    = 'Eord',
  118.     keyOrdRegular    = 'norm',
  119.     keyOrdReverse    = 'revs',
  120.     _myEnumrationOrder
  121. };
  122.  
  123. enum myEnumerateTypeAs {
  124. //    typeTypeOption    = 'Etyp',
  125.     keyTypeAlpha    = 'alph',
  126.     keyTypeNumb    = 'numb',
  127.     _myEnumerateTypeAs
  128. };
  129.  
  130. enum cacheLogField {
  131.     kSortByName    = 4,
  132.     kSortByDate    = 3,
  133.     kSortBySize    = 8,
  134.     kSortByType    = 6,
  135.     kSortByUrl    = 5,
  136.     _cacheLogField
  137. };
  138.  
  139. enum viewByConstants {
  140. //    typeviewBy        = 'vwBY',
  141.     viewBySmallIcon    = 'smic',    // 0; bySmallIcon
  142.     viewByIcon        = 'iimg',    // 1; byIcon
  143.     viewByName        = 'pnam',    // 2; byName
  144.     viewByModDate        = 'modd',    // 3; byModDate
  145.     viewBySize        = 'ptsz',    // 4; bySize
  146.     viewByKind        = 'kind',    // 5; byKind
  147.     viewByCommnet        = 'comt',    // 6; byComment
  148.     viewByLabel        = 'labi',    // 7; byLabel
  149.     viewByVersion        = 'vers',    // 8; byVersion
  150.     _viewByConstants
  151. };
  152.  
  153. #ifdef COMMENT
  154. enum AppleEventConstants {
  155.     kCoreEventClass        = 'aevt',
  156.     kAECoreSuite        = 'core',
  157.     kAEMiscStandards    = 'misc',
  158.     kAEOpenApplication    = 'oapp',
  159.     kAEOpenDocuments    = 'odoc',
  160.     kAEPrintDocuments    = 'pdoc',
  161.     kAEQuitApplication    = 'quit',
  162.     kAESetData            = 'setd',
  163.     kAEData            = 'data',
  164.     kAENoReply        = 0x00000001,
  165.     typeChar            = 'TEXT',
  166.     typeAEList            = 'list',
  167.     typeAERecord        = 'reco',
  168.     typeFSS            = 'fss ',
  169.     typeObjectSpecifier    = 'obj ',
  170.     typeWildCard        = '****',
  171.     typeType            = 'type',
  172.     typeKeyword        = 'keyw',
  173.     typeNull            = 'null',
  174.     keyDirectObject        = '----',
  175.     keyErrorNumber    = 'errn',
  176.     keyErrorString        = 'errs',
  177.     _AppleEventConstants
  178. };
  179. #endif /* COMMENT */
  180.  
  181. /***** Constants & Globals *****/
  182. //extern Boolean    gAEOpenAppl;
  183. //extern Boolean    gAEOpenDocs;
  184. //extern Boolean    gAEPrintDoc;
  185. //extern Boolean    gAEQuitAppl;
  186.  
  187. // callback functions, defined in 'main.c'
  188. extern OSErr DoOpenApplication ( void );
  189. extern OSErr DoQuitApplication ( void );
  190. extern OSErr DoPrintDocument ( void );
  191. //extern OSErr DoOpenDocumentBegin ( void );
  192. //extern OSErr DoOpenDocumentEnd ( void );
  193. extern OSErr DoOpenDocument ( FSSpec *theFSSpec, long index, long count );
  194.  
  195.  
  196. // prototypes
  197. /***** Do Apple Event process *****/
  198. pascal OSErr DoOpenApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  199. pascal OSErr DoOpenDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  200. pascal OSErr DoPrintDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  201. pascal OSErr DoQuitApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  202.  
  203. /***** AppleScript Suite *****/
  204. pascal OSErr DoActivate ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  205. pascal OSErr DoResolve ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  206. pascal OSErr DoSort ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  207. pascal OSErr DoSetData ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  208. pascal OSErr DoShowAbout ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  209. pascal OSErr DoMiscEvent ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon );
  210.  
  211. /***** Apple Event routines *****/
  212. static OSErr GotRequiredParams ( AppleEvent *appleEvent );
  213. static OSErr AEPutFieldArray ( AEDescList *resultList, ArrayHandle arrayH );
  214. static void ErrMsgAE ( long err, Boolean fatal );
  215.  
  216. /***** setup Apple Event handles *****/
  217.  
  218. #define AEInstall(eventClass,eventID,procHandle)    {¥
  219.     err = AEInstallEventHandler( eventClass, eventID, (AEEventHandlerProcPtr)procHandle, 0L, false);    ¥
  220.     if ( err != noErr ) ErrorMessageAE( err, true ); }
  221.  
  222. void SetupAppleEvent ( void )
  223. {
  224.     OSErr    err;
  225.     long        feature;
  226.  
  227.     GestaltCheck( gestaltAppleEventsAttr );
  228.  
  229.     // for Required Suite
  230.     AEInstall( kCoreEventClass, kAEOpenApplication, DoOpenApp );
  231.     AEInstall( kCoreEventClass, kAEOpenDocuments, DoOpenDoc );
  232.     AEInstall( kCoreEventClass, kAEPrintDocuments, DoPrintDoc );
  233.     AEInstall( kCoreEventClass, kAEQuitApplication, DoQuitApp );
  234.  
  235.     // for AppleScript Suite
  236. //    AEInstall( kAECoreSuite, kAECreateElement, DoCreateElement );
  237. //    AEInstall( kAECoreSuite, kAEClose, DoCloseElement );
  238.     AEInstall( kAEMiscStandards, kAEActivate, DoActivate );
  239.     AEInstall( kNCRSuite, kAESetData, DoSetData );
  240. //    AEInstall( kAECoreSuite, kAEGetData, DoGetData );
  241.     AEInstall( kNCRSuite, kAEResolve, DoResolve );
  242.     AEInstall( kNCRSuite, kAESort, DoSort );
  243.     AEInstall( kNCRSuite, kAEShowAbout, DoShowAbout );
  244. //    AEInstall( typeWildCard, typeWildCard, DoMiscEvent );
  245.  
  246.  
  247. #ifdef COMMENT        // for Resolving Object Specifier Records
  248.     err = AEInstallObjectAccessor( cProperty, typeWildCard, (OSLAccessorProcPtr) MyPropertyObjectAccessor, 0, false );
  249.     if ( err != noErr ) Message("MyPropertyObjectAccessor not available.¥n");
  250.  
  251.     err = AEInstallObjectAccessor( typeWildCard, typeWildCard, (OSLAccessorProcPtr) MyObjectAccessor, 0, false );
  252.     if ( err != noErr ) Message("MyObjectAccessor not available.¥n");
  253.  
  254.     err = AESetObjectCallbacks(
  255.         (OSLCompareProcPtr) MyCompareObjects, 
  256.         (OSLCountProcPtr) MyCountObjects,
  257.         (OSLDisposeTokenProcPtr)nil,
  258.         (OSLGetMarkTokenProcPtr)nil,
  259.         (OSLMarkProcPtr)nil,
  260.         (OSLAdjustMarksProcPtr)nil,
  261.         (OSLGetErrDescProcPtr)nil);
  262.     if ( err != noErr ) Message("AESetObjectCallbacks not available.¥n");
  263. #endif /* COMMENT */
  264.     
  265.     err = AESetInteractionAllowed( kAEInteractWithLocal );
  266. }
  267.  
  268. /***** Do Apple Event process *****/
  269. pascal OSErr DoOpenApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  270. {
  271. #ifdef DEBUG
  272.     Message("Apple event: Open Application Event¥n");
  273. #endif /* DEBUG */
  274.  
  275.     DoOpenApplication();
  276.  
  277. //    gAEOpenAppl = true;
  278.  
  279.     return noErr;
  280. }
  281.  
  282. pascal OSErr DoOpenDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  283. {
  284.     AEDescList        fileSpecList = {typeNull, nil};
  285.     FSSpec        fileSpec;
  286.     DescType        type;
  287.     AEKeyword        keyword;
  288.     Size            actual;
  289.     long            count;
  290.     long            index;
  291.     OSErr        err = noErr;
  292.  
  293. #ifdef DEBUG
  294.     Message("Apple event: Open Document Event¥n");
  295. #endif /* DEBUG */
  296.  
  297. //    DoOpenDocumentBegin();
  298.  
  299.     err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &fileSpecList);
  300.     if ( err != noErr ) { ErrMsgAE( err, false); goto out; }
  301.  
  302.     err = GotRequiredParams( theAppleEvent );
  303.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
  304.  
  305.     err = AECountItems( &fileSpecList, &count );
  306.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
  307.  
  308.     for (index=1; index<=count; index++) {
  309.         err = AEGetNthPtr( &fileSpecList, index, typeFSS, &keyword, &type,
  310.                         (Ptr) &fileSpec, sizeof( FSSpec ), &actual );
  311.         if ( err != noErr ) { ErrMsgAE( err, false ); goto out; }
  312.  
  313.         err = DoOpenDocument( &fileSpec, index, count );
  314.         if ( err != noErr ) break;
  315.     }
  316.  
  317.   out:
  318.       if ( fileSpecList.dataHandle != nil ) AEDisposeDesc( &fileSpecList );
  319.  
  320. //    DoOpenDocumentEnd();
  321. //    gAEOpenDocs = true;
  322.     
  323.     return err;
  324. }
  325.  
  326. pascal OSErr DoPrintDoc ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  327. {
  328. #ifdef DEBUG
  329.     Message("Apple event: Print Document Event¥n");
  330. #endif /* DEBUG */
  331.  
  332.     DoPrintDocument();
  333.     
  334. //    gAEPrintDoc = true;
  335.     
  336.     return noErr;
  337. }
  338.  
  339. pascal OSErr DoQuitApp ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  340. {
  341. #ifdef DEBUG
  342.     Message("Apple event: Quit Application Event¥n");
  343. #endif /* DEBUG */
  344.  
  345.     DoQuitApplication();
  346.     
  347. //    gAEQuitAppl = true;
  348.  
  349.     return noErr;
  350. }
  351.  
  352. /***** AppleScript Suite *****/
  353. /***** Command: activate *****/
  354. pascal OSErr DoActivate ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  355. {
  356.     ProcessSerialNumber PSN;
  357.     OSErr            err;
  358.  
  359. #ifdef DEBUG
  360.     Message("Apple event: Activate Event¥n");
  361. #endif /* DEBUG */
  362.  
  363.     err = GetCurrentProcess( &PSN );
  364.     if ( err != noErr ) {
  365.         ErrMsgAE( err,  false );
  366.     } else {
  367.         err = SetFrontProcess( &PSN );
  368.     }
  369.     
  370.     return err;
  371. }
  372.  
  373.  
  374. /***** Command: resolve *****/
  375. #ifdef COMMENT
  376. // AppleScript Command: resolve $typeAlias$ [with sorted by $Enum$]
  377.     kNCRSuite        = 'MzcR',        // EVENT CLASS
  378.     kAEResolve        = 'rslv',        // EVENT ID
  379. // Reply:
  380.     typeAEList        = 'list',        // a list of string 'TEXT'
  381. // Direct Parameter: 
  382.     typeAlias        = 'alis',        // a list of aliases
  383. // Other Parameters: [with sorted by name/date/size/type/url]
  384.     kAESorted        = 'soby',        // KEYWORD
  385.     typeSortOption    = 'Esrt',        // see also Enumaration
  386. #endif /* COMMENT */
  387.  
  388.  
  389. pascal OSErr DoResolve ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  390. {
  391.     AEDescList        fileSpecList = {typeNull, nil};
  392.     AEDesc        fileSpecDesc = {typeNull, nil};
  393.     AEDesc        desc = {typeNull, nil};
  394.     long            sortKeyPosition = 0;
  395.     Boolean        withSorted = false;
  396.     Boolean        asNumber = false;
  397.     Boolean        inReverse = false;
  398.     AEDescList        resultList = {typeNull, nil};
  399.     long            index, indexLast=0, count;
  400.     DescType        type, dataType;
  401.     OSErr        err = noErr;
  402.  
  403. #ifdef DEBUG
  404.     Message("Apple event: Resolve Event¥n");
  405. #endif /* DEBUG */
  406.  
  407. // Responding to AppleEvent message
  408.     // Get Direct Parameter
  409. #ifdef DEBUG
  410.     Message("DoResolve: Direct Param¥n");
  411. #endif /* DEBUG */
  412.     err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &fileSpecList);    // created 'fileSpecList'
  413.     if ( err != noErr ) { ErrMsgAE( err, false); goto out_responding; }
  414.  
  415.     err = AECountItems( &fileSpecList, &count );
  416.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  417.  
  418.     for (index=1; index<=count; index++) {
  419.         FSSpec        fileSpec;
  420.         Size            actual;
  421.         AEKeyword        keyword;
  422.         
  423.         err = AEGetNthPtr( &fileSpecList, index, typeFSS, &keyword, &type,
  424.                         (Ptr) &fileSpec, sizeof( FSSpec ), &actual );
  425.         if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  426.         AEPutFile ( &fileSpec );
  427.     }
  428.  
  429.     // Get Other Parameter [with sorted by $Enum$]
  430. #ifdef DEBUG
  431.     Message("DoResolve: Other Param [with sorted by]¥n");
  432. #endif /* DEBUG */
  433.     err = AEGetParamDesc( theAppleEvent, kAESorted, typeWildCard, &desc);        // created 'desc'
  434.     if ( err != noErr ) {
  435.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  436.     //    sortKeyPosition = 0;
  437.     //    withSorted = false;
  438.     } else {
  439.         type = desc.descriptorType;
  440.         if ( type == typeEnumerated ) {
  441.             dataType = * (DescType *) *desc.dataHandle;
  442.         #ifdef DEBUG
  443.             Message("DoResolve: Param [with sorted by '%T'] as '%T'¥n", dataType, type );
  444.         #endif /* DEBUG */
  445.             withSorted = true; asNumber = false; inReverse = false;
  446.             switch ( dataType ) {
  447.                 case keyByName:        sortKeyPosition = kSortByName;    break;;
  448.                 case keyByDate:        sortKeyPosition = kSortByDate;    asNumber = true; inReverse = true; break;
  449.                 case keyBySize:        sortKeyPosition = kSortBySize;    asNumber = true; inReverse = true; break;
  450.                 case keyByType:        sortKeyPosition = kSortByType;    break;
  451.                 case keyByUrl:        sortKeyPosition = kSortByUrl;    break;
  452.                 default:
  453.                 #ifdef DEBUG
  454.                     Message("DoResolve: Wrong Param [with sorted by '%T'] as '%T'¥n", dataType, type );
  455.                 #endif /* DEBUG */
  456.                     withSorted = false;
  457.                     err = errAEWrongDataType; goto out_responding;
  458.                     break;
  459.             }
  460.         } else {
  461.         #ifdef DEBUG
  462.             Message("DoResolve: Wrong Param [with sorted by '%T']¥n", type );
  463.         #endif /* DEBUG */
  464.             withSorted = false;
  465.             err = errAEWrongDataType; goto out_responding;
  466.         }
  467.     }
  468.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose of 'desc'
  469.  
  470.     // Have I read through the parameters?
  471. #ifdef DEBUG
  472.     Message("Apple event: DoResolve GotRequiredParams()¥n");
  473. #endif /* DEBUG */
  474.     err = GotRequiredParams( theAppleEvent );
  475.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  476.  
  477.   out_responding:
  478.         if ( fileSpecList.dataHandle != nil ) AEDisposeDesc( &fileSpecList );    // dispose of 'fileSpecList'
  479.         if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );            // dispose of 'desc' if needed
  480.     if ( err != noErr ) goto out;
  481.  
  482.  
  483. // Handling data with parameters
  484.     count = AECountFileList();
  485.  
  486. // Creating and Sending AppleEvent message
  487. #ifdef DEBUG
  488.     Message("Apple event: DoResolve AECreateList()¥n");
  489. #endif /* DEBUG */
  490.     err = AECreateList( nil, 0, false, &resultList );        // create a AEDisc 'resultList'
  491.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  492.  
  493.     // add the contents of the file to 'resultList'
  494.     for ( index=0; index<count; index++ ) {
  495.         FSSpec    fileSpec;
  496.         FInfo        fileInfo;
  497.         Handle    arrayH = nil;
  498.         Handle    theHndl = nil;
  499.         long        datasize, arraySize;
  500.  
  501.         AEGetFile ( &fileSpec, index );
  502.  
  503. #ifdef DEBUG
  504.         Message("filename[%ld]='%S'¥n",(index+1),fileSpec.name);
  505.         Message("Apple event: DoResolve AEPutPtr(%ld)¥n", (index+1));
  506. #endif /* DEBUG */
  507.  
  508. #ifdef Not_Yet_Implemented
  509.  
  510.         err = AEPutPtr( &resultList, indexLast, typeChar, &fileSpec.name[1], fileSpec.name[0] );    
  511.         if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  512.  
  513. #else /* Not_Yet_Implemented */
  514.  
  515.         // read record from the file
  516.         theHndl = NewHandleClear( 0 );        // create a Handle 'theHndl'
  517.         if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
  518.         
  519.         err = GetRecordFromFile ( &fileSpec, &fileInfo, theHndl, &datasize );    
  520.         if ( err != noErr ) { ErrMsgAE( err, false ); goto out_putting; }
  521.         
  522.         // convert 'theHndl' to 'arrayH' with sorting
  523.         arrayH = NewHandleClear( 0 );        // create a Handle 'arrayH'
  524.         if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
  525.         
  526.         // use default Field Separator and Record Separator
  527.         arraySize = SetupFieldArray( theHndl, (ArrayHandle) arrayH, sortKeyPosition );
  528.     
  529.         if ( withSorted ) {
  530.             HLock( arrayH );
  531.             qsort( (Array *) *arrayH, 0, arraySize-1, asNumber, inReverse );
  532.             HUnlock( arrayH );
  533.         }
  534.  
  535.         // add 'arrayH' to 'resultList'
  536.         err = AEPutFieldArray( &resultList, (ArrayHandle) arrayH );
  537.         if ( err != noErr ) { ErrMsgAE( err, false ); }
  538.  
  539.   out_putting:
  540.         if ( arrayH != nil ) DisposeHandle( arrayH );    // dispose the Handle 'arrayH'
  541.         if ( theHndl != nil ) DisposeHandle( theHndl );    // dispose the Handle 'theHndl'
  542. #endif /* Not_Yet_Implemented */
  543.     }
  544.  
  545. #ifdef DEBUG
  546.     Message("Apple event: DoResolve AEPutParamDesc()¥n");
  547. #endif /* DEBUG */
  548.     err = AEPutParamDesc( reply, keyDirectObject, &resultList );
  549.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  550.     
  551.   out_sending:
  552.       if ( resultList.dataHandle != nil ) AEDisposeDesc( &resultList );    // dispose the AEDisc 'resultList'
  553.   
  554.   out:
  555.       AEDisposFileList();
  556.       
  557.     return err;
  558. }
  559.  
  560. /***** Command: sort *****/
  561. #ifdef COMMENT
  562. // AppleScript Command: sort $typeAEList$
  563. //                    [at $integer$] [in regular/normal] [as alphabet/number] [with $TEXT$]
  564.     kNCRSuite        = 'MzcR',        // EVENT CLASS
  565.     kAESort        = 'sort',        // EVENT ID
  566. // Reply:
  567.     typeAEList        = 'list',        // a list of string 'TEXT'
  568. // Direct Parameter: 
  569.     typeAEList        = 'list',        // a list of string 'TEXT'
  570. // Other Parameters: [at $integer$]
  571.     kAEPosition    = 'posn',        // KEYWORD
  572.     typeLongInteger    = 'long',        // field number
  573. // Other Parameter: [by name/date/size/type/url]
  574.     kAESorted        = 'soby',        // KEYWORD
  575.     typeSortOption    = 'Esrt',        // see also Enumaration
  576. // Other Parameters: [in regular/normal]
  577.     kAEOrder        = 'ordr',        // KEYWORD
  578.     typeOrderOption    = 'Eord',        // see also Enumaration
  579. // Other Parameters: [as alphabet/number]
  580.     kAETypeAs        = 'type',        // KEYWORD
  581.     typeTypeOption    = 'Etyp',        // see also Enumaration
  582. // Other Parameters: [with $TEXT$]
  583.     kAESeparator    = 'sepa',        // KEYWORD
  584.     typeChar        = 'TEXT',        // field separator
  585. #endif /* COMMENT */
  586.  
  587. #define TAB    '¥t'                // Field Separator
  588. #define EOL    '¥r'                // Record Separator
  589.  
  590. pascal OSErr DoSort ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  591. {
  592.     AEDescList        descList = {typeNull, nil};
  593.     AEDescList        resultList = {typeNull, nil};
  594.     AEDesc        desc = {typeNull, nil};
  595.     DescType        type, dataType;
  596.     AEKeyword        theAEKeyword;
  597.  
  598.     Handle        theHndl = nil;
  599.     Handle        arrayH = nil;
  600.     long            size;
  601.     long            sortKeyPosition = 4;
  602.     Boolean        inReverse = false;
  603.     Boolean        asNumber = false;
  604.     unsigned char    fieldSeparator = TAB;
  605.  
  606.     long            count, index;
  607.     OSErr        err = noErr;
  608.  
  609. #ifdef DEBUG
  610.     Message("Apple event: Sort Event¥n");
  611. #endif /* DEBUG */
  612.  
  613. // Responding to AppleEvent message
  614.     // Direct Parameter
  615. #ifdef DEBUG
  616.     Message("DoSort: Direct Param¥n");
  617. #endif /* DEBUG */
  618.     err = AEGetParamDesc( theAppleEvent, keyDirectObject, typeAEList, &descList );    // create AEDisc 'descList'
  619.     if ( err != noErr ) { ErrMsgAE( err, false); goto out_responding; }
  620.  
  621.     err = AECountItems( &descList, &count );
  622.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  623.  
  624.     theHndl = NewHandleClear( 0 );        // create a handle 'theHndl'
  625.     if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
  626.  
  627.     for (index=1; index<=count; index++) {
  628.         Handle    theHndl2;
  629.         long        size2;
  630.         
  631.         err = AEGetNthDesc( &descList, index, typeChar, &theAEKeyword, &desc );    // created 'desc'
  632.         if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  633.         theHndl2 = desc.dataHandle;
  634.         size = GetHandleSize(theHndl);
  635.         size2 = GetHandleSize(theHndl2);
  636.         SetHandleSize( theHndl, size+size2+1);
  637.         if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
  638.         BlockMove( (Ptr) *theHndl2, (Ptr) *theHndl+size, size2 );
  639.         ((unsigned char *) *theHndl)[size+size2] = EOL;
  640.         
  641.         if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );        // dispose of 'desc'
  642.     }
  643.  
  644.     // Other Parameter [at $integer$]
  645. #ifdef DEBUG
  646.     Message("DoSort: Param [at $integer$]¥n");
  647. #endif /* DEBUG */
  648.     desc.dataHandle = nil;
  649.     err = AEGetParamDesc( theAppleEvent, kAEPosition, typeWildCard, &desc);    // created 'desc'
  650.     if ( err != noErr ) {
  651.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  652.     //    sortKeyPosition = 0;
  653.     } else {
  654.         type = desc.descriptorType;
  655.         if ( type == typeLongInteger ) {
  656.             sortKeyPosition = * (long *) *desc.dataHandle;
  657.         #ifdef DEBUG
  658.             Message("DoSort: Param [at %ld] as '%T'¥n", sortKeyPosition, type );
  659.         #endif /* DEBUG */
  660.         } else {
  661.         #ifdef DEBUG
  662.             Message("DoSort: Wrong Param by '%T'¥n", type );
  663.         #endif /* DEBUG */
  664.             err = errAEWrongDataType; goto out_responding;
  665.         }
  666.     }
  667.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose of 'desc'
  668.  
  669.     // Get Other Parameter [by name/date/size/type/url]
  670. #ifdef DEBUG
  671.     Message("DoResolve: Other Param [with sorted by]¥n");
  672. #endif /* DEBUG */
  673.     err = AEGetParamDesc( theAppleEvent, kAESorted, typeWildCard, &desc);        // created 'desc'
  674.     if ( err != noErr ) {
  675.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  676.     //    sortKeyPosition = 0;
  677.     } else {
  678.         type = desc.descriptorType;
  679.         if ( type == typeEnumerated ) {
  680.             dataType = * (DescType *) *desc.dataHandle;
  681.         #ifdef DEBUG
  682.             Message("DoResolve: Param [with sorted by '%T'] as '%T'¥n", dataType, type );
  683.         #endif /* DEBUG */
  684.             asNumber = false; inReverse = false;
  685.             switch ( dataType ) {
  686.                 case keyByName:        sortKeyPosition = kSortByName;    break;;
  687.                 case keyByDate:        sortKeyPosition = kSortByDate;    asNumber = true; inReverse = true; break;
  688.                 case keyBySize:        sortKeyPosition = kSortBySize;    asNumber = true; inReverse = true; break;
  689.                 case keyByType:        sortKeyPosition = kSortByType;    break;
  690.                 case keyByUrl:        sortKeyPosition = kSortByUrl;    break;
  691.                 default:
  692.                 #ifdef DEBUG
  693.                     Message("DoResolve: Wrong Param [with sorted by '%T'] as '%T'¥n", dataType, type );
  694.                 #endif /* DEBUG */
  695.                     err = errAEWrongDataType; goto out_responding;
  696.                     break;
  697.             }
  698.         } else {
  699.         #ifdef DEBUG
  700.             Message("DoResolve: Wrong Param [with sorted by '%T']¥n", type );
  701.         #endif /* DEBUG */
  702.             err = errAEWrongDataType; goto out_responding;
  703.         }
  704.     }
  705.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose of 'desc'
  706.  
  707.     // Other Parameter  [in regular/normal]
  708. #ifdef DEBUG
  709.     Message("DoSort: Param [in regular/normal]¥n");
  710. #endif /* DEBUG */
  711.     desc.dataHandle = nil;
  712.     err = AEGetParamDesc( theAppleEvent, kAEOrder, typeWildCard, &desc);        // created 'desc'
  713.     if ( err != noErr ) {
  714.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  715.     //    inReverse = false;
  716.     } else {
  717.         type = desc.descriptorType;
  718.         if ( type == typeEnumerated ) {
  719.             dataType = * (DescType *) *desc.dataHandle;
  720.         #ifdef DEBUG
  721.             Message("DoSort: Param [in '%T'] as '%T'¥n", dataType, type );
  722.         #endif /* DEBUG */
  723.             switch ( dataType ) {
  724.                 case keyOrdRegular:    inReverse = false;    break;
  725.                 case keyOrdReverse:    inReverse = true;    break;
  726.                 default:
  727.             #ifdef DEBUG
  728.                     Message("DoSort: Wrong Param [in '%T'] by '%T'¥n", dataType, type );
  729.             #endif /* DEBUG */
  730.                     err = errAEWrongDataType; goto out_responding;
  731.                     break;
  732.             }
  733.         } else {
  734.         #ifdef DEBUG
  735.             Message("DoSort: Wrong Param by '%T'¥n", type );
  736.         #endif /* DEBUG */
  737.             err = errAEWrongDataType; goto out_responding;
  738.         }
  739.     }
  740.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose of 'desc'
  741.  
  742.     // Other Parameter  [as alphabet/number]
  743. #ifdef DEBUG
  744.     Message("DoSort: Param [as alphabet/number]¥n");
  745. #endif /* DEBUG */
  746.     desc.dataHandle = nil;
  747.     err = AEGetParamDesc( theAppleEvent, kAETypeAs, typeWildCard, &desc);    // created 'desc'
  748.     if ( err != noErr ) {
  749.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  750.     //    asNumber = false;
  751.     } else {
  752.         type = desc.descriptorType;
  753.         if ( type == typeEnumerated ) {
  754.             dataType = * (DescType *) *desc.dataHandle;
  755.         #ifdef DEBUG
  756.             Message("DoSort: Param [as '%T'] as '%T'¥n", dataType, type );
  757.         #endif /* DEBUG */
  758.             switch ( dataType ) {
  759.                 case keyTypeAlpha:    asNumber = false;    break;
  760.                 case keyTypeNumb:    asNumber = true;    break;
  761.                 default:
  762.             #ifdef DEBUG
  763.                     Message("DoSort: Wrong Param [as '%T'] by '%T'¥n", dataType, type );
  764.             #endif /* DEBUG */
  765.                     err = errAEWrongDataType; goto out_responding;
  766.                     break;
  767.             }
  768.         } else {
  769.             #ifdef DEBUG
  770.                 Message("DoSort: Wrong Param by '%T'¥n", type );
  771.             #endif /* DEBUG */
  772.             err = errAEWrongDataType; goto out_responding;
  773.         }
  774.     }
  775.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );        // dispose of 'desc'
  776.  
  777.     // Other Parameter [with $TEXT$]
  778. #ifdef DEBUG
  779.     Message("DoSort: Param [with $TEXT$]¥n");
  780. #endif /* DEBUG */
  781.     desc.dataHandle = nil;
  782.     err = AEGetParamDesc( theAppleEvent, kAESeparator, typeWildCard, &desc);        // created 'desc'
  783.     if ( err != noErr ) {
  784.         if ( err != errAEDescNotFound ) { ErrMsgAE( err, false ); goto out_responding; }
  785.     //    fieldSeparator = TAB;
  786.     } else {
  787.         type = desc.descriptorType;
  788.         if ( type == typeChar ) {
  789.             fieldSeparator = * (unsigned char *) *desc.dataHandle;
  790.         #ifdef DEBUG
  791.             Message("DoSort: Param [with ¥¥%03o] as '%T'¥n", fieldSeparator, type );
  792.         #endif /* DEBUG */
  793.         } else {
  794.         #ifdef DEBUG
  795.             Message("DoSort: Wrong Param by '%T'¥n", type );
  796.         #endif /* DEBUG */
  797.             err = errAEWrongDataType; goto out_responding;
  798.         }
  799.     }
  800.       if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose of 'desc'
  801.  
  802.  
  803.     // Have I read through the parameters?
  804. #ifdef DEBUG
  805.     Message("Apple event: DoSort GotRequiredParams()¥n");
  806. #endif /* DEBUG */
  807.     err = GotRequiredParams( theAppleEvent );
  808.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_responding; }
  809.  
  810.   out_responding:
  811.         if ( desc.dataHandle != nil ) AEDisposeDesc( &desc );    // dispose the AEDesc 'desc' if needed
  812.     if ( err != noErr ) goto out;
  813.  
  814.  
  815. // Handling data with parameters
  816.  
  817.     arrayH = NewHandleClear( 0 );        // create a Handle 'arrayH'
  818.     if ( (err=MemError()) != noErr ) { ErrorMessageMEM( err, true ); }
  819.     
  820.     ((Array *) *arrayH)->fs = fieldSeparator;
  821.     count = SetupFieldArray( theHndl, (ArrayHandle) arrayH, sortKeyPosition );
  822.     
  823.     HLock( arrayH );
  824.     qsort( (Array *) *arrayH, 0, count-1, asNumber, inReverse );
  825.     HUnlock( arrayH );
  826.  
  827.  
  828. // Creating and Sending AppleEvent message
  829.  
  830. #ifdef DEBUG
  831.     Message("Apple event: DoResolve AECreateList()¥n");
  832. #endif /* DEBUG */
  833.     err = AECreateList( nil, 0, false, &resultList );    // create a AEDesc 'resultList'
  834.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  835.  
  836.     err = AEPutFieldArray( &resultList, (ArrayHandle) arrayH );
  837.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  838.  
  839. #ifdef DEBUG
  840.     Message("Apple event: DoSort AEPutParamDesc()¥n");
  841. #endif /* DEBUG */
  842.     err = AEPutParamDesc( reply, keyDirectObject, &resultList );
  843.     if ( err != noErr ) { ErrMsgAE( err, false ); goto out_sending; }
  844.     
  845.   out_sending:
  846.     if ( arrayH != nil ) DisposeHandle( arrayH );    // dispose the Handle 'arrayH'
  847.       if ( resultList.dataHandle != nil ) AEDisposeDesc( &resultList );    // dispose the AEDesc 'resultList'
  848.       goto out;
  849.   
  850.   out:
  851.       if ( theHndl != nil ) DisposeHandle( theHndl);    // dispose handle 'theHndl'
  852.        
  853.     return err;
  854. }
  855.  
  856. /***** Command: assign *****/
  857. #ifdef COMMENT
  858. // AppleScript Command: assign $typeObjectSpecifier$ to value
  859.     kNCRSuite        = 'MzcR',        // EVENT CLASS
  860.     kAESetData        = 'setd',        // EVENT ID
  861. // Reply:
  862.     typeNull        = 'null',
  863. // Direct Parameter: 
  864.     typeObjectSpecifier    = 'obj ',    // an object
  865. // Other Parameters: to value
  866.     kAEData        = 'data',        // KEYWORD
  867.     typeWildCard    = '****',
  868. #endif /* COMMENT */
  869.  
  870. pascal OSErr DoSetData ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  871. {
  872. #ifdef DEBUG
  873.     Message("Apple event: Set Data Event¥n");
  874. #endif /* DEBUG */
  875.  
  876.     // Sorry, do nothing here.
  877.  
  878.     return noErr;
  879. }
  880.  
  881. /***** Command: show about *****/
  882. #ifdef COMMENT
  883. // AppleScript Command: show about
  884.     kNCRSuite        = 'MzcR',        // EVENT CLASS
  885.     kAEShowAbout    = 'abou',        // EVENT ID
  886. // Reply:
  887.     typeNull        = 'null',
  888. // Direct Parameter: 
  889.     typeNull        = 'null',
  890. // Other Parameters:
  891.     typeNull        = 'null',
  892. #endif /* COMMENT */
  893.  
  894. #define    kAboutID        130
  895.  
  896. pascal Boolean idleProc ( EventRecord *event, long *sleeptime, RgnHandle *mouseRgn );
  897.  
  898. pascal OSErr DoShowAbout ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  899. {
  900.     OSErr    err;
  901.     
  902. #ifdef DEBUG
  903.     Message("Apple event: Show About¥n");
  904. #endif /* DEBUG */
  905.  
  906.     err = AEInteractWithUser( kAEDefaultTimeout, nil, (AEIdleProcPtr) idleProc );
  907.     if ( err != noErr ) { ErrMsgAE( err, false ); return err; }
  908.  
  909.     Alert( kAboutID, nil );
  910.     
  911.     return noErr;
  912. }
  913.  
  914. pascal Boolean idleProc ( EventRecord *event, long *sleeptime, RgnHandle *mouseRgn )
  915. {
  916.     switch ( event->what ) {
  917.         case updateEvt:
  918.         case activateEvt:
  919.         case osEvt:
  920.             break;
  921.         case nullEvent:
  922.             SystemTask();
  923.             break;
  924.     }
  925.     
  926.     return false;
  927. }
  928.  
  929. /***** Command: miscellaneous *****/
  930. pascal OSErr DoMiscEvent ( AppleEvent *theAppleEvent, AppleEvent *reply, long refCon )
  931. {
  932. #ifdef DEBUG
  933.     Message("Apple event: Miscellaneous Event¥n");
  934. #endif /* DEBUG */
  935.  
  936.     //MyInspectDescList( theAppleEvent );
  937.  
  938.     return noErr;
  939. }
  940.  
  941.  
  942. /***** Apple Event routines *****/
  943. static OSErr GotRequiredParams ( AppleEvent *appleEvent )
  944. {
  945.     DescType    returnedType;
  946.     Size        actualSize;
  947.     OSErr    err;
  948.  
  949.     err = AEGetAttributePtr( appleEvent, keyMissedKeywordAttr, typeWildCard,
  950.                         &returnedType, nil, 0, &actualSize );
  951.  
  952.     if ( err == errAEDescNotFound )  return noErr;
  953.     else if ( err == noErr )  return errAEEventNotHandled;
  954.     else return err;
  955. }
  956.  
  957. static OSErr AEPutFieldArray ( AEDescList *resultList, ArrayHandle arrayH )
  958. {
  959.     Handle        theHndl;
  960.     long            count, len, k;
  961.     long            indexLast=0;
  962.     unsigned char    *p, *q;
  963.     OSErr        err = noErr;
  964.     
  965.     count = ((Array *) *arrayH)->count;
  966.     if ( count <= 0 ) return err;
  967.  
  968.     theHndl = ((Array *) *arrayH)->h;
  969.     HLock( theHndl );
  970.     p = (unsigned char *) *theHndl;
  971.  
  972.     for ( k=0; k<count; k++ ) {
  973. #ifdef TEST_QSORT
  974.         q = p + ((Array *) *arrayH)->pair[k].keyword;
  975.         len = ((Array *) *arrayH)->pair[k].keywordlen;
  976. #else /* TEST_QSORT */
  977.         q = p + ((Array *) *arrayH)->pair[k].text;
  978.         len = ((Array *) *arrayH)->pair[k].textlen;
  979. #endif /* TEST_QSORT */
  980. #ifdef DEBUG
  981. //        Message("Apple event: DoResolveRecord AEPutPtr(%ld)¥n", (k+1));
  982. #endif /* DEBUG */
  983.         err = AEPutPtr( resultList, indexLast, typeChar, q, len );
  984.         if ( err != noErr ) { ErrMsgAE( err, false ); break; }
  985.     }
  986.     
  987.     HUnlock( theHndl );
  988.  
  989.     return err;
  990. }
  991.  
  992.  
  993. static void ErrMsgAE ( long err, Boolean fatal )
  994. {
  995. #ifdef DEBUG
  996.     ErrorMessageAE ( err, fatal );
  997. #endif /* DEBUG */
  998. }
  999.  
  1000. /***** Apple Event FileList *****/
  1001.  
  1002. static long        gFSSpecListNum = 0;
  1003. static Handle    gFSSpecList = nil;
  1004.  
  1005. long AECountFileList ( void )
  1006. {
  1007.     return gFSSpecListNum;
  1008. }
  1009.  
  1010. void AEPutFile ( FSSpec *theFSSpec )
  1011. {
  1012.     long        index;
  1013.     Size        dataSize = sizeof( FSSpec );
  1014.     Handle    theHandle;
  1015.     OSErr    err;
  1016.  
  1017.     theHandle = gFSSpecList;
  1018.     
  1019.     if ( theHandle == nil ) {
  1020.         theHandle = NewHandleClear( dataSize );
  1021.         gFSSpecList = theHandle;
  1022.         if ( theHandle == nil ) { /* error */
  1023.             ErrorMessageMEM( memFullErr, true ); }
  1024.     } else {
  1025.         dataSize += GetHandleSize( theHandle );
  1026.         SetHandleSize( theHandle, dataSize );
  1027.         if ( (err=MemError()) != noErr ) { /* error */
  1028.             ErrorMessageMEM( err, true ); }
  1029.     }
  1030.     
  1031.     index = gFSSpecListNum;
  1032.     ((FSSpec *) *theHandle)[index] = *theFSSpec;
  1033.     
  1034.     gFSSpecListNum += 1;
  1035. }
  1036.  
  1037. Boolean AEGetFile ( FSSpec *theFSSpec, long index )
  1038. {
  1039.     if ( index < 0 || gFSSpecListNum <= index )  return false;
  1040.     
  1041.     *theFSSpec = ((FSSpec *) *gFSSpecList)[index];
  1042.     
  1043.     return true;
  1044. }
  1045.  
  1046. void AEDisposFileList ( void )
  1047. {
  1048.     if ( gFSSpecList != nil ) DisposHandle( gFSSpecList );
  1049.     gFSSpecList = nil;
  1050.  
  1051.     gFSSpecListNum = 0;
  1052. }
  1053.  
  1054.  
  1055. // end of program
  1056.  
  1057. #ifdef SAMPLE
  1058. void main( void )
  1059. {
  1060.     GestaltCheck( gestaltSystemVersion );
  1061. //    GestaltCheck( gestaltProcessorType );    // for version 1.1.1
  1062.  
  1063.     InitToolbox();
  1064.     SetupMenuBar();
  1065.     SetupAppleEvent();
  1066.  
  1067.     EventLoop();
  1068.  
  1069.     ExitToShell();
  1070. }
  1071.  
  1072. void EventLoop( void )
  1073. {
  1074.     Boolean        gotEvent;
  1075.     EventRecord    event;
  1076.     RgnHandle        mouseRgn;
  1077.  
  1078.     gDone = false;
  1079.     mouseRgn = nil;
  1080.  
  1081.     while ( gDone == false ) {
  1082.         gotEvent = WaitNextEvent(everyEvent,&event,kSleep,mouseRgn);
  1083.         if ( gotEvent ) DoEvent( &event );
  1084.     }
  1085. }
  1086.  
  1087.  
  1088. void DoEvent( EventRecord *event )
  1089. {
  1090.     char        theChar;
  1091.     Boolean    toActive;
  1092.  
  1093.     switch( event->what ) {
  1094.     case kHighLevelEvent:
  1095.         if ( event->message == kCoreEventClass ) 
  1096.             switch ( *((long *) (&(event->where))) ) {
  1097.                 case kAEOpenApplication:    gAEOpenAppl = true; break;
  1098.                 case kAEOpenDocuments:    gAEOpenDocs = true; break;
  1099.                 case kAEPrintDocuments:    gAEPrintDoc = true; break;
  1100.                 case kAEQuitApplication:    gAEQuitAppl = true; break;
  1101.                 default:                break; }
  1102.         AEProcessAppleEvent( event );
  1103.         break;
  1104.     case mouseDown:
  1105.         HandleMouseDown( event );
  1106.         break;
  1107.     case mouseUp:
  1108.     case keyUp:
  1109.         break;
  1110.     case keyDown:
  1111.     case autoKey:
  1112.     case updateEvt:
  1113.         DoUpdate( (WindowPtr) (event->message), event );
  1114.         break;
  1115.     case activateEvt:
  1116.         toActive = ( (event->modifiers & activeFlag) == activeFlag );
  1117.         DoActivate( (WindowPtr) (event->message), toActive );
  1118.         break;
  1119.     case diskEvt:
  1120.     case networkEvt:
  1121.     case driverEvt:
  1122.     case app1Evt:
  1123.     case app2Evt:
  1124.     case app3Evt:
  1125.     case osEvt:
  1126.         DoSuspentResume( event );
  1127.         break;
  1128.     }
  1129. }
  1130.  
  1131. #endif /* SAMPLE */
  1132.  
  1133.  
  1134.  
  1135.